package android.demo.handler;

import android.demo.BaseActivity;
import android.demo.R;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;

public class HandlerActivityB extends BaseActivity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		Log.i(TAG, "Current Thread ID: " + Thread.currentThread().getId());
		myHandler.post(myRunnable);
	}
	
	/**
	 * 在主线程（UI线程）里，如果创建Handler时不传入Looper对象，
	 * 那么将直接使用主线程（UI线程）的Looper对象（系统已经帮我们创建了）；
	 * 在其它线程里，如果创建Handler时不传入Looper对象，
	 * 那么，这个Handler将不能接收处理消息。
	 * 在创建Handler之前，为该线程准备好一个Looper（Looper.prepare），
	 * 然后让这个Looper跑起来（Looper.loop），抽取Message，这样，Handler才能正常工作。
	 * 因此，Handler处理消息总是在创建Handler的线程里运行
	 */
	private Handler myHandler = new Handler();
	
	/**
	 * 有两种与Handler通信的方式：消息和Runnable对象。
	 * 
	 * 关于消息：
	 * 要向Handler发送一个Message，首先调用obtainMessage()从池中获取Message对象。
	 * obtainMessage()对象有许多特点，允许创建空的Message对象或填充了消息标示符和参数的对象。
	 * 需要的Handler处理过程越复杂，就越需要将数据放在Message中，以帮助Handler区分不同的事件。
	 * 然后可以通过消息队列将Message发送给Handler，此时需要使用sendMessage…()系列方法中的一个方法。
	 * 
	 * sendMessage();立即将消息放在队列中。
	 * 
	 * sendMessageAtFrontOfQueue();立即将消息放在队列中，并将其放在消息队列的最前面，这样该消息就会具有比所有其他消息更高的优先级。
	 * 
	 * sendMessageAtTime();在规定的时间将消息放在队列中，这个时间用ms表示，基于系统正常工作时间。（SystemClock.uptimeMillis()）
	 * 
	 * sendMessageDelayed();在一段延迟之后将消息放在队列中，延迟用ms表示。
	 * 
	 * 要处理这些消息，Handler需要实现handleMessage()，将使用出现在消息队列中的每个消息来调用handleMessage()。
	 * 此处Handler可以根据需要更新UI。但是，它仍然应该迅速完成此工作，因为在它完成之前，其他UI工作会暂停。
	 * 
	 * 关于Runnable ：
	 * 如果不愿意使用Message对象，也可以将Runnable对象传递给Handler，Handler将在ActivityUI线程上运行这些Runnable对象。
	 * Handler提供了一组post…()方法来传入Runnable对象供最终处理。
	 * 
	 * 对Android的消息循环机制的理解，可以仿照Windows消息循环的机制进行。
	 * 每个Handler都会和一个线程和线程的message queue关联起来，此时你可以传递messages 和 runnable对象到message queue中。
	 * 后面可以从message queue中拿出该对象并且执行。Handler， Message queue这两个对象之间的交互，就涉及到了Looper这个东西。
	 */
	private Runnable myRunnable = new Runnable() {
		
		public void run() {
			try {
				Thread.sleep(10000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			Log.i(TAG, "Current Runnable Thread ID: " + Thread.currentThread().getId());
		}
	};
}
